package hash

import (
	"bufio"
	"crypto/md5"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"github.com/google/uuid"
	"io"
	"miomp-terminal-suite/backend/log"
	"os"
	"strings"
)

func Md5Util(src io.Reader) (md5Value string, err error) {

	data, err := io.ReadAll(src)
	if err != nil {
		return "", err
	}
	md5Byte := md5.Sum(data)
	return hex.EncodeToString(md5Byte[:]), nil
}

func Md5FileUtil(filePath string) (md5Value string, err error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", nil
	}
	defer func(f *os.File) {
		err := f.Close()
		if err != nil {
			log.LOG.Error("打开文件时出错:", log.U.ErrorFiled(err))
		}
	}(file)
	r := bufio.NewReader(file)
	h := md5.New()
	_, err = io.Copy(h, r)
	if err != nil {
		return "", nil
	}
	md5Byte := h.Sum(nil)
	return hex.EncodeToString(md5Byte[:]), nil
}

func Md5StringUtil(src string) (md5Value string, err error) {
	md5Byte := md5.Sum([]byte(src))
	return hex.EncodeToString(md5Byte[:]), nil
}

func SHA256StringUtil(src string) (md5Value string, err error) {
	sha256Byte := sha256.Sum256([]byte(src))
	return hex.EncodeToString(sha256Byte[:]), nil
}

// Md5ReadFromFile 从文件读取md5值
func Md5ReadFromFile(srcPath string) (md5Value string, err error) {
	// 打开文件
	file, err := os.Open(srcPath)
	if err != nil {
		fmt.Printf("无法打开文件: %v\n", err)
		return
	}
	defer func(file *os.File) {
		err := file.Close()
		log.LOG.Error("打开文件时出错:", log.U.ErrorFiled(err))
	}(file)

	// 使用 strings.Builder 来存储文件内容
	var fileContent strings.Builder

	// 使用 bufio.Scanner 逐行读取文件
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		// 将每一行添加到 strings.Builder 中
		fileContent.WriteString(scanner.Text())
	}

	// 检查读取过程中是否出现错误
	if err := scanner.Err(); err != nil {
		log.LOG.Error("读取文件时出错:", log.U.ErrorFiled(err))
	}

	// 将文件内容存储到一个字符串变量中
	text := fileContent.String()

	return text, nil
}

// GenerateUUID 生成UUID
func GenerateUUID() string {
	u4 := uuid.New()
	return hex.EncodeToString(u4[:])
}
